package wechat

import (
	"crypto/tls"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego/logs"
	"io/ioutil"
	"net/http"
	"strings"
)

type Scene struct {
	SceneStr string `json:"scene_str"`
}

type ActionInfo struct {
	Scene Scene `json:"scene"`
}

type SceneQrcode struct {
	ExpireSeconds int64      `json:"expire_seconds"` // 该二维码有效时间，以秒为单位。 最大不超过2592000（即30天），此字段如果不填，则默认有效期为30秒。
	ActionName    string     `json:"action_name"`    // 二维码类型，QR_SCENE为临时的整型参数值，QR_STR_SCENE为临时的字符串参数值，QR_LIMIT_SCENE为永久的整型参数值，QR_LIMIT_STR_SCENE为永久的字符串参数值
	ActionInfo    ActionInfo `json:"action_info"`    // 二维码详细信息
}

type SceneQrcodeRes struct {
	Ticket        string `json:"ticket"`         // 获取的二维码ticket，凭借此ticket可以在有效时间内换取二维码。
	ExpireSeconds int64  `json:"expire_seconds"` // 该二维码有效时间，以秒为单位。 最大不超过2592000（即30天）。
	Url           string `json:"url"`            // 二维码图片解析后的地址，开发者可根据该地址自行生成需要的二维码图片
}

// 生成临时的带参数的二维码
func CreateSceneQrcode(sceneStr string) *SceneQrcodeRes {
	scene := Scene{SceneStr: sceneStr}
	actionInfo := ActionInfo{Scene: scene}
	sceneQrcode := SceneQrcode{
		ExpireSeconds: 24 * 3600,
		ActionName:    "QR_STR_SCENE",
		ActionInfo:    actionInfo,
	}
	content, err := json.Marshal(sceneQrcode)
	if err != nil {
		logs.Error("can not marshal scene qrcode struct:", err)
		return nil
	}
	accessToken := GetAccessToken("anban")
	url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s", accessToken)
	req, _ := http.NewRequest("POST", url, strings.NewReader(string(content)))
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	client := &http.Client{Transport: tr}
	resp, err := client.Do(req)
	if err != nil {
		logs.Error("send wechat create scene qrcode request fail:", err)
		return nil
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		logs.Error("can not read from wechat create scene qrcode response:", err)
		return nil
	}
	sceneQrcodeRes := SceneQrcodeRes{}
	err = json.Unmarshal(body, &sceneQrcodeRes)
	if err != nil {
		logs.Error("can not unmarshal wechat create scene qrcode response:", err)
		return nil
	}
	return &sceneQrcodeRes
}
